<?php
class PayAction extends Action {
	public function go(){
		$this->payto();
	}
	public function payto() {
		header('Content-Type: text/html; charset=utf-8');
		$order_id = isset ($_REQUEST['orderform_id']) ? $_REQUEST['orderform_id'] : 0;
		$pay_type = isset ($_REQUEST['pay_type']) ? $_REQUEST['pay_type'] : 0;
		if (!$order_id ) exit ('error!:PARM NO ORDER_ID');
		if(empty($pay_type)){
			$mo = M('Orderform');
			$map['orderform_id'] = $order_id;
			$pay_type = $mo->where($map)->getField('pay_type');
		}
		if (!$pay_type)
			exit ('error!:PARM NO PAY_TYPE');
		switch ($pay_type) {
			case 1 :
				$this->payAlipay($order_id);
				break;
			case 2 :
				$this->payTenpay($order_id);
				break;
			case 3 :
				$this->payChinabank($order_id);
				break;
			default :
				break;

		}
	}

	public function payTenpay($order_id) {
		date_default_timezone_set(PRC);
		/* 平台商密钥 */
		$key = C('TENPAY_KEY');
		/* 平台商帐号 */
		$chnid = C('TENPAY_CHNID');
		/* 卖家 */
		$seller = C('TENPAY_SELLER');
		Vendor('Tenpay.MediPayRequestHandler');
		$morder = M('Orderform');
		$orderinfo = $morder->where('orderform_id=' . $order_id)->find();
		if (!$orderinfo)
			exit ('error4:NONE ORDER!');
		//$is_payed = Session :: get('orderform_'.$orderinfo['orderform_id']);
		if ($orderinfo['progress'] != 1)
			exit ('error3:PAYED!');
		if (!empty ($is_payed))
			exit ('error3:PAYED!');
		/* 交易说明 */
		//$mch_desc = '可可网订单号' .$orderinfo['code'].' 交易说明：'.strip_tags($orderinfo['detail']);
		$mch_desc = '可可网订单号' . $orderinfo['code'];
		/* 商品名称 */
		$mch_name = 'cocodiy' . $orderinfo['code'];
		/* 商品总价，单位为分 */
		$mch_price = ((int) $orderinfo['final_fee']) * 100;
		/* 回调通知URL */
		$mch_returl = C('TENPAY_REURL');
		/* 商家的定单号 */
		$mch_vno = $orderinfo['code'] . '-' . rand(1000, 9999);
		/* 支付后的商户支付结果展示页面 */
		$show_url = C('TENPAY_SHOW_URL');
		/* 物流公司或物流方式说明 */
		$transport_desc = "";
		/* 需买方另支付的物流费用,以分为单位 */
		$transport_fee = "";
		/* 创建支付请求对象 */
		$reqHandler = new MediPayRequestHandler();
		$reqHandler->init();
		$reqHandler->setKey($key);

		//----------------------------------------
		//设置支付参数
		//----------------------------------------
		$reqHandler->setParameter("chnid", $chnid); //平台商帐号
		$reqHandler->setParameter("encode_type", "2"); //编码类型 1:gbk 2:utf-8
		$reqHandler->setParameter("mch_desc", $mch_desc); //交易说明
		$reqHandler->setParameter("mch_name", $mch_name); //商品名称
		$reqHandler->setParameter("mch_price", $mch_price); //商品总价，单位为分
		$reqHandler->setParameter("mch_returl", $mch_returl); //回调通知URL
		$reqHandler->setParameter("mch_type", "1"); //交易类型：1、实物交易，2、虚拟交易
		$reqHandler->setParameter("mch_vno", $mch_vno); //商家的定单号
		$reqHandler->setParameter("need_buyerinfo", "2"); //是否需要在财付通填定物流信息，1：需要，2：不需要。
		$reqHandler->setParameter("seller", $seller); //卖家财付通帐号
		$reqHandler->setParameter("show_url", $show_url); //支付后的商户支付结果展示页面
		$reqHandler->setParameter("transport_desc", $transport_desc); //物流公司或物流方式说明
		$reqHandler->setParameter("transport_fee", $transport_fee); //需买方另支付的物流费用

		//请求的URL
		$reqUrl = $reqHandler->getRequestURL();
		redirect($reqUrl);
		//		//debug信息
		//$debugInfo = $reqHandler->getDebugInfo();
		//		
		//echo "<br/>" . $reqUrl . "<br/>";
		//echo "<br/>" . $debugInfo . "<br/>";
		//$reqHandler->doSend();
		//		
		//$this->assign('alipaystr',$sHtmlText);
		//$this->display('payAlipay');
	}
	public function payAlipay($order_id) {
		$partner = C('ALIPAY_PARTNER');
		$key = C('ALIPAY_KEY');
		$seller_email = C('ALIPAY_EMAIL');
		$notify_url = C('ALIPAY_NOTIFY_URL');
		$return_url = C('ALIPAY_RETURN_URL');
		$show_url = C('ALIPAY_SHOW_URL');
		$mainname = C('ALIPAY_NAME');
		$sign_type = C('ALIPAY_SIGN_TYPE');
		$_input_charset = C('ALIPAY_CHARSET');
		$transport = C('ALIPAY_TRANS');
		Vendor('Alipay.alipay_service');
		$morder = M('Orderform');
		$orderinfo = $morder->where('orderform_id=' . $order_id)->find();
		if (!$orderinfo)
			exit ('error4:NONE ORDER!');
		//$is_payed = Session :: get('orderform_'.$orderinfo['orderform_id']);
		if ($orderinfo['progress'] != 1)
			exit ('error3:PAYED!');
		if (!empty ($is_payed))
			exit ('error3:PAYED!');

		/*以下参数是需要通过下单时的订单数据传入进来获得*/
		//必填参数
		$out_trade_no = $orderinfo['code']; //请与贵网站订单系统中的唯一订单号匹配
		$subject = '可可网' . $out_trade_no; //订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
		$body = '可可网订单号' . $out_trade_no; //订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
		$price = $orderinfo['final_fee']; //订单总金额，显示在支付宝收银台里的“应付总额”里

		//$logistics_fee = $orderinfo['freight_fee']; //物流费用，即运费。
		$logistics_fee = '0';
		$logistics_type = "EXPRESS"; //物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、（EMS）
		if ($orderinfo['express_type'] == 2)
			$logistics_type = "EXPRESS";
		$logistics_payment = "BUYER_PAY"; //物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）

		$quantity = "1"; //商品数量，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品。

		//扩展参数——买家收货信息（推荐作为必填）
		//该功能作用在于买家已经在商户网站的下单流程中填过一次收货信息，而不需要买家在支付宝的付款流程中再次填写收货信息。
		//若要使用该功能，请至少保证receive_name、receive_address有值
		//收货信息格式请严格按照姓名、地址、邮编、电话、手机的格式填写
		$receive_name = $orderinfo['consignee']; //收货人姓名，如：张三
		if ($orderinfo['is_self'] == 1)
			$receive_name = $orderinfo['self_name'];
		$receive_address = $orderinfo['consignee_addr']; //收货人地址，如：XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
		$receive_zip = $orderinfo['zipcode']; //收货人邮编，如：123456
		$receive_phone = $orderinfo['consignee_tel']; //收货人电话号码，如：0571-81234567
		$receive_mobile = $orderinfo['consignee_phone']; //收货人手机号码，如：13312341234
		if ($orderinfo['is_self'] == 1)
			$receive_name = $orderinfo['self_phone'];

		//扩展参数——第二组物流方式
		//物流方式是三个为一组成组出现。若要使用，三个参数都需要填上数据；若不使用，三个参数都需要为空
		//有了第一组物流方式，才能有第二组物流方式，且不能与第一个物流方式中的物流类型相同，
		//即logistics_type="EXPRESS"，那么logistics_type_1就必须在剩下的两个值（POST、EMS）中选择
		$logistics_fee_1 = ""; //物流费用，即运费。
		$logistics_type_1 = ""; //物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
		$logistics_payment_1 = ""; //物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）

		//扩展参数——第三组物流方式
		//物流方式是三个为一组成组出现。若要使用，三个参数都需要填上数据；若不使用，三个参数都需要为空
		//有了第一组物流方式和第二组物流方式，才能有第三组物流方式，且不能与第一组物流方式和第二组物流方式中的物流类型相同，
		//即logistics_type="EXPRESS"、logistics_type_1="EMS"，那么logistics_type_2就只能选择"POST"
		$logistics_fee_2 = ""; //物流费用，即运费。
		$logistics_type_2 = ""; //物流类型，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
		$logistics_payment_2 = ""; //物流支付方式，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）

		//扩展功能参数——其他
		$buyer_email = ''; //默认买家支付宝账号
		$discount = ''; //折扣，是具体的金额，而不是百分比。若要使用打折，请使用负数，并保证小数点最多两位数

		/////////////////////////////////////////////////

		//构造要请求的参数数组
		$parameter = array (
			"service" => "create_partner_trade_by_buyer", //接口名称，不需要修改
	"payment_type" => "1", //交易类型，不需要修改

	//获取配置文件(alipay_config.php)中的值
	"partner" => $partner,
			"seller_email" => $seller_email,
			"return_url" => $return_url,
			"notify_url" => $notify_url,
			"_input_charset" => $_input_charset,
			"show_url" => $show_url,

			//从订单数据中动态获取到的必填参数
	"out_trade_no" => $out_trade_no,
			"subject" => $subject,
			"body" => $body,
			"price" => $price,
			"quantity" => $quantity,

			"logistics_fee" => $logistics_fee,
			"logistics_type" => $logistics_type,
			"logistics_payment" => $logistics_payment,

			//扩展功能参数——买家收货信息
	"receive_name" => $receive_name,
			"receive_address" => $receive_address,
			"receive_zip" => $receive_zip,
			"receive_phone" => $receive_phone,
			"receive_mobile" => $receive_mobile,

			//扩展功能参数——第二组物流方式
	"logistics_fee_1" => $logistics_fee_1,
			"logistics_type_1" => $logistics_type_1,
			"logistics_payment_1" => $logistics_payment_1,

			//扩展功能参数——第三组物流方式
	"logistics_fee_2" => $logistics_fee_2,
			"logistics_type_2" => $logistics_type_2,
			"logistics_payment_2" => $logistics_payment_2,

			//扩展功能参数——其他
	"discount" => $discount,
			"buyer_email" => $buyer_email
		);
		$this->assign('ordercode', $out_trade_no);
		$this->assign('ordertotal', $price);
		//Session :: set('orderform_'.$orderinfo['orderform_id'],$orderinfo['orderform_id']);
		//构造请求函数
		//echo $key;
		//echo $sign_type;
		//dump($parameter);
		$alipay = new alipay_service($parameter, $key, $sign_type);
		$sHtmlText = $alipay->build_form();
		$this->assign('alipaystr', $sHtmlText);
		$this->display('payAlipay');
	}
	public function payChinabank($order_id) {
		$v_mid = C('CNBANK_USER_CODE'); // 商户号，这里为测试商户号1001，替换为自己的商户号(老版商户号为4位或5位,新版为8位)即可
		$v_url = 'http://www.cocodiy.com/index.php/Pay/rec'; // 请填写返回url,地址应为绝对路径,带有http协议
		$key = C('CNBANK_USER_PASS');
		// 如果您还没有设置MD5密钥请登陆我们为您提供商户后台，地址：https://merchant3.chinabank.com.cn/
		// 登陆后在上面的导航栏里可能找到“B2C”，在二级导航栏里有“MD5密钥设置” 
		// 建议您设置一个16位以上的密钥或更高，密钥最多64位，但设置16位已经足够了
		$morder = M('Orderform');
		$orderinfo = $morder->where('orderform_id=' . $order_id)->find();
		if (!$orderinfo)
			exit ('error4:NONE ORDER!');
		//$is_payed = Session :: get('orderform_'.$orderinfo['orderform_id']);
		if ($orderinfo['progress'] != 1)
			exit ('error3:PAYED!');
		if (!empty ($is_payed))
			exit ('error3:PAYED!');

		$this->assign('v_mid', $v_mid);

		$v_oid = trim($orderinfo['code']); //订单号，建议构成格式 年月日-商户号-小时分钟秒
		$this->assign('v_oid', $v_oid);
		$v_amount = $orderinfo['final_fee']; //支付金额               
		$this->assign('v_amount', $v_amount);
		$v_moneytype = "CNY"; //币种
		$this->assign('v_moneytype', $v_moneytype);
		$this->assign('v_url', $v_url);
		$text = $v_amount . $v_moneytype . $v_oid . $v_mid . $v_url . $key; //md5加密拼凑串,注意顺序不能变
		$v_md5info = strtoupper(md5($text)); //md5函数加密并转化成大写字母
		$this->assign('v_md5info', $v_md5info);
		$remark1 = '可可网订单号' . $v_oid; //备注字段1
		$this->assign('remark1', $remark1);
		$remark2 = ''; //备注字段2
		$this->assign('remark2', $remark2);
		$v_rcvname = $orderinfo['consignee']; //收货人姓名，如：张三
		$this->assign('v_rcvname', $v_rcvname);
		if ($orderinfo['is_self'] == 1)
			$v_rcvname = $orderinfo['self_name'];
		$this->assign('v_rcvname', $v_rcvname);
		$v_rcvaddr = $orderinfo['consignee_addr']; // 收货地址
		$this->assign('v_rcvaddr', $v_rcvaddr);
		$v_rcvtel = $orderinfo['consignee_tel']; // 收货人电话
		$this->assign('v_rcvtel', $v_rcvtel);
		$v_rcvpost = $orderinfo['zipcode']; // 收货人邮编
		$this->assign('v_rcvpost', $v_rcvpost);
		$v_rcvemail = ''; // 收货人邮件
		$this->assign('v_rcvemail', $v_rcvemail);
		$v_rcvmobile = $orderinfo['consignee_phone']; // 收货人手机号
		$this->assign('v_rcvmobile', $v_rcvmobile);
		$v_ordername = $orderinfo['consignee']; // 订货人姓名
		$this->assign('v_ordername', $v_ordername);
		$v_orderaddr = $orderinfo['consignee_addr']; // 订货人地址
		$this->assign('v_orderaddr', $v_orderaddr);
		$v_ordertel = $orderinfo['consignee_tel']; // 订货人电话
		$this->assign('v_ordertel', $v_ordertel);
		$v_orderpost = $orderinfo['zipcode']; // 订货人邮编
		$this->assign('v_orderpost', $v_orderpost);
		$v_orderemail = ''; // 订货人邮件
		$this->assign('v_orderemail', $v_orderemail);
		$v_ordermobile = $orderinfo['consignee_phone']; // 订货人手机号 
		$this->assign('v_ordermobile', $v_ordermobile);
		$this->display('payChinabank');

	}

	public function rec() {
		//网银在线
		$key = C('CNBANK_USER_PASS');
		$v_oid = trim($_POST['v_oid']); // 商户发送的v_oid定单编号   
		$v_pmode = trim($_POST['v_pmode']); // 支付方式（字符串）   
		$v_pstatus = trim($_POST['v_pstatus']); //  支付状态 ：20（支付成功）；30（支付失败）
		$v_pstring = trim($_POST['v_pstring']); // 支付结果信息 ： 支付完成（当v_pstatus=20时）；失败原因（当v_pstatus=30时,字符串）； 
		$v_amount = trim($_POST['v_amount']); // 订单实际支付金额
		$v_moneytype = trim($_POST['v_moneytype']); //订单实际支付币种    
		$remark1 = trim($_POST['remark1']); //备注字段1
		$remark2 = trim($_POST['remark2']); //备注字段2
		$v_md5str = trim($_POST['v_md5str']); //拼凑后的MD5校验值  
		$md5string = strtoupper(md5($v_oid . $v_pstatus . $v_amount . $v_moneytype . $key));
		//file_put_contents('log.txt','note'.$v_oid . '|'.$v_pstatus .  '|'.$v_amount .  '|'.$v_moneytype . '|'. $key);
		header('Content-Type: text/html; charset=utf-8');
		if ($v_md5str == $md5string) {
			if ($v_pstatus == "20") {
				$morder = M('Orderform');
				$map['code'] = $v_oid;
				//$map['progress'] = 1;
				$data['progress'] = 2;
				if(!empty($v_oid)) $morder->where($map)->save($data);
				echo "<html> <body> <TABLE width=500 border=0 align='center' cellPadding=0 cellSpacing=0> <TBODY> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE: 14px'>MD5校验码: $v_md5str </B></div></TD> </TR> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE:  14px'>订单号: $v_oid </B></div></TD> </TR> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE:  14px'>支付卡种: $v_pmode </B></div></TD> </TR> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE:  14px'>支付结果: $v_pstring </B></div></TD> </TR> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE:  14px'>支付金额: $v_amount </B></div></TD> </TR> <TR> <TD vAlign=top align=middle> <div align='left'><B><FONT style='FONT-SIZE:  14px'>支付币种: $v_moneytype </B></div></TD> </TR> </TBODY></TABLE>" .
						"<script> setTimeout('window.location.href='" .
								U('User/index').
								",2000);</script>" .
						" </BODY> </HTML>";
			} else {
				echo "支付失败";
			}
		} else {
			echo "支付失败";
		}

	}
}
?>